package com.bdqn.day0914.tools;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.bdqn.day0914.entity.User;
import sun.net.www.http.HttpClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

/**
 * @Author:Corday
 * @Date:2021/09/14/9:31
 */
public class DemoJson {
    // // 1.json字符串解析为java对象
    public static void jsonToJava() {
        //String menu="{'one':'第一章','1.1':'小说','1.1.1':'桃花'}";
        //一个字符串，格式上符合json
        String str = "{'add':'肥东县','zs':{'id':101,'name':'张三'}," +
                "'us':[{'id':104,'name':'小美'},{'id':105,'name':'小红'}]}";
        System.out.println(str);
        //将字符串转成json对象
        JSONObject jsonObject = JSONObject.parseObject(str);
        //(1)如果键名对应的是一个简单数据，则务必用此方法获取
        System.out.println("------json普通对象------");
        String add = jsonObject.get("add").toString();
        System.out.println("地址：" + add);
        //解析zs
        //String zs=jsonObject.get("zs").toString();
        //System.out.println("zs："+zs);
        JSONObject zs = jsonObject.getJSONObject("zs");
        //(2)直接通过键名获取部分实体数据
        System.out.println("姓名：" + zs.get("name"));
        System.out.println("学号：" + zs.get("id"));
        //(3)直接通过键名获取实体类的对象
        User user = jsonObject.getObject("zs", User.class);
        //同样生成java对象，更加清晰
        User uu = JSON.toJavaObject(zs, User.class);
        System.out.println("id:" + user.getId());
        System.out.println("name:" + user.getName());
        //(4)获取json数组[{'id':104,'name':'小美'},{'id':105,'name':'小红'}]
        System.out.println("--------json数组---------");
        JSONArray us = jsonObject.getJSONArray("us");
        //少量数据的解析可以直接使有JSONObject对象的get方法获取，再往前端传
        JSONObject u1 = us.getJSONObject(0);
        System.out.println(u1.get("name"));
        //大量数据的解析，要将json数组解析为list集合，再往前端传
        List<User> list = JSONObject.parseArray(us.toString(), User.class);
        //遍历所有
        for (User u : list) {
            System.out.println("姓名：" + u.getName() + " 学号：" + u.getId());
        }
        //另一种生list对象的方法，此方式能生成其它集合对象
        //JSON.parseObject(us.toString(),new TypeReference<Map<String,User>>(){});
        List<User> users = JSON.parseObject(us.toString(), new TypeReference<List<User>>() {
        });
        for (User u : users) {
            System.out.println("name：" + u.getName() + " id：" + u.getId());
        }
        //少量数据的获取直接使用JSONObject的get方法,大量数据则转成java对象
    }

    // //2.将java对象转成json对象,contoller中将通过retrun与@Responsebody自动转换
    //此处手动返回
    public static void javaToJson() {
        //(1)将java对象转json字符串
        User user = new User(1008, "tom");
        String str = JSON.toJSON(user).toString();
        System.out.println(str);
        //(2)将list对象转json字符串
        List<User> list = new ArrayList<>();
        list.add(new User(1009, "coco"));
        list.add(new User(1010, "tina"));
        list.add(new User(1011, "kitty"));
        String string = JSON.toJSONString(list);
        System.out.println(string);
        //(3)将日期对象转成符合要求的json字符串对象
        System.out.println("----日期数据的解析---");
        Date date = new Date();
        String temp = JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss", new SerializerFeature[0]);
        System.out.println(temp);
        Calendar cd = Calendar.getInstance();
        int y = cd.get(Calendar.YEAR);
        int m = cd.get(Calendar.MONDAY) + 1;
        int d = cd.get(Calendar.DAY_OF_MONTH);
        System.out.println(y + "年 " + m + "月 " + d + "日");
        //自己封装一个日期对的json字符串
        String mydate = "{'yy':" + y + ",'mm':" + m + ",'dd':" + d + "}";
        System.out.println(mydate);
        JSONObject o = JSON.parseObject(mydate);
        System.out.println(o.get("yy"));
        System.out.println(o.get("mm"));
        System.out.println(o.get("dd"));
    }

    //    网络json数据的解析
    //如何正确获取百度天气，https://query.asilu.com/weather/baidu/
    //获取北京天气，http://www.weather.com.cn/data/cityinfo/101010100.html
    public static void getWebJson(){
        String u = "http://www.weather.com.cn/data/cityinfo/101010100.html";
        //1.通过网络编程拿到网络数据
        URL url = null;
        //HttpClient也能实现网络操作
        HttpURLConnection httpURLConnection=null;
        try {
            url=new URL(u);//创建一个网络地址对象
            //生成一个网络连接对象
            httpURLConnection = (HttpURLConnection) url.openConnection();
            //设置网络请求的方式
            httpURLConnection.setRequestMethod("GET");
            //设置网络连接的延时
           httpURLConnection.setConnectTimeout(3000);
            //执行网络连接
            httpURLConnection.connect();
            //获取字节流数据
            InputStream in = httpURLConnection.getInputStream();
            //将字节流转成字符流,注意此处汉字编码
            InputStreamReader isr= new InputStreamReader(in,"utf-8");
            //通过字符缓冲流获取网络数据，并转换成字符串
            BufferedReader br=new BufferedReader(isr);
            //创建字符串对象，用于存取每一行字符字串
            String temp=null;
            //创建保存所有字符串信息的对象
            StringBuffer sbf = new StringBuffer("");
            while ((temp=br.readLine())!=null){
                //请解决temp乱码问题
                //String t=new String(temp.getBytes(),"gb2312");
                sbf.append(temp);
            }
           br.close();
            String weather=sbf.toString();
            //System.out.println(weather);
            decodeJson(weather);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(httpURLConnection!=null){
                //清除网络连接对象
                httpURLConnection.disconnect();
            }
        }
    }
   //封装一个方法，用于解决天气,输出城市名称，最低与最高温度
    public  static  void decodeJson(String str){
        JSONObject obj=JSONObject.parseObject(str);
        JSONObject o= obj.getJSONObject("weatherinfo");
        System.out.println("城市："+o.get("city"));
        System.out.println("最低："+o.get("temp1"));
        System.out.println("最高："+o.get("temp2"));
    }
    //  执行函数
    public static void main(String[] args) {
        //jsonToJava();
        //javaToJson();
        getWebJson();
    }
}

